﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using App_Persistencia;
using System.Net.Mail;
using System.Net;
using System.IO;
using System.Data;
using System.Web;

namespace App_Negocio
{
    public class Presupuesto
    {

        List<Presupuesto_Detalle> presupuestoDetalle = new List<Presupuesto_Detalle>();

        public List<Presupuesto_Detalle> PresupuestoDetalle
        {
            get { return presupuestoDetalle; }
            set { presupuestoDetalle = value; }
        }

        List<Servicio_Adicional> servicioAdicional = new List<Servicio_Adicional>();

        public List<Servicio_Adicional> ServicioAdicional
        {
            get { return servicioAdicional; }
            set { servicioAdicional = value; }
        }

        
        /*
        List<Bebida> bebida = new List<Bebida>();

        public List<Bebida> Bebida
        {
            get { return bebida; }
            set { bebida = value; }
        }
        
        */

        List<Presupuesto_Bebida> bebidas = new List<Presupuesto_Bebida>();

        public List<Presupuesto_Bebida> Bebidas
        {
            get { return bebidas; }
            set { bebidas = value; }
        }



        int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }

        int cantPersonas;

        public int CantPersonas
        {
            get { return cantPersonas; }
            set { cantPersonas = value; }
        }

        EventoTipo tipoEvento;

        public EventoTipo TipoEvento
        {
            get { return tipoEvento; }
            set { tipoEvento = value; }
        }

        Salon salon;

        public Salon Salon
        {
            get { return salon; }
            set { salon = value; }
        }

        Cliente cliente;

        public Cliente Cliente
        {
            get { return cliente; }
            set { cliente = value; }
        }

        DateTime fechaCreacion;

        public DateTime FechaCreacion
        {
            get { return fechaCreacion; }
            set { fechaCreacion = value; }
        }

        DateTime fechaEvento;

        public DateTime FechaEvento
        {
            get { return fechaEvento; }
            set { fechaEvento = value; }
        }

        Presupuesto_Estado pEstado = new Presupuesto_Estado();

        public Presupuesto_Estado PEstado
        {
            get { return pEstado; }
            set { pEstado = value; }
        }

        string comentario;

        public string Comentario
        {
            get { return comentario; }
            set { comentario = value; }
        }

        public void guardarPresupuesto()
        {
            float precioPresupuesto = 0;
            
            App_Persistencia.Cliente_Data clienteData = new Cliente_Data();
            clienteData.ClienteId = cliente.ClienteId;

            App_Persistencia.Salon_Data salonData = new Salon_Data();
            salonData.Id = salon.Id;

            if (salon.Id != 0)
            {
                salonData.Precio = salon.Precio;
                precioPresupuesto += salon.Precio;
            }

            App_Persistencia.EventoTipo_Data evTipo = new EventoTipo_Data();
            evTipo.Id = tipoEvento.Id;


            List<Servicio_Adicional_Data> sAdicionalList = new List<Servicio_Adicional_Data>();

            foreach (Servicio_Adicional sAd in ServicioAdicional)
            {
                App_Persistencia.Servicio_Adicional_Data sAdicData = new Servicio_Adicional_Data();
                sAdicData.Id = sAd.Id;
                sAdicData.Precio = sAd.Precio;
                precioPresupuesto += sAd.Precio;
                sAdicionalList.Add(sAdicData);
            }

            //precioPresupuesto = precioPresupuesto / CantPersonas;
            
            
            List<Presupuesto_Bebida_Data> presuBebidaDataList = new List<Presupuesto_Bebida_Data>();

            foreach (Presupuesto_Bebida beb in Bebidas)
            {
                App_Persistencia.Presupuesto_Bebida_Data presupuestoBebidaData = new Presupuesto_Bebida_Data();
                presupuestoBebidaData.Bebida= new Bebida_Data();
                presupuestoBebidaData.Bebida.Id = beb.Bebida.Id;
                presupuestoBebidaData.Bebida.Precio = beb.Bebida.Precio;
                presupuestoBebidaData.CantidadBebida = beb.CantidadBebida;
                //precioPresupuesto += beb.Bebida.Precio;
                precioPresupuesto += beb.Costo();
                presuBebidaDataList.Add(presupuestoBebidaData);
            }

            precioPresupuesto = precioPresupuesto / CantPersonas;
           
            List<Presupuesto_Detalles_Data> pDet = new List<Presupuesto_Detalles_Data>();

            foreach (Presupuesto_Detalle pd in PresupuestoDetalle)
            {
                App_Persistencia.Menu_Data menuData = new Menu_Data();
                App_Persistencia.Presupuesto_Detalles_Data presDetData = new Presupuesto_Detalles_Data();
                menuData.Id = pd.Menu.Id;
                menuData.Precio = pd.PrecioCosto;
                presDetData.Menu = menuData;
                presDetData.PrecioCosto = precioPresupuesto+pd.Menu.Precio;
                pDet.Add(presDetData);
            }

            App_Persistencia.Presupuesto_Estado_Data estado = new Presupuesto_Estado_Data();
            estado.Numero = pEstado.Numero;
            App_Persistencia.Presupuesto_Data presupuesto = new Presupuesto_Data();
            presupuesto.CantPersonas = CantPersonas;
            presupuesto.Salon = salonData;
            presupuesto.TipoEvento = evTipo;
            presupuesto.PresupuestoDetalle = pDet;
            presupuesto.ServicioAdicional = sAdicionalList;
            presupuesto.Bebidas = presuBebidaDataList;
            
            presupuesto.Cliente = clienteData;
            presupuesto.FechaCreacion = FechaCreacion;
            presupuesto.FechaEvento = FechaEvento;
            presupuesto.PEstado = estado;
            presupuesto.Comentario = comentario;

            try
            {
                presupuesto.guardarPresupuesto();
            }
            catch (SystemException ex)
            {
                throw new SystemException(ex.Message);
            }
        }

        public void enviarMail(string urlLogo)
        {

            string LOGO = urlLogo;// "http://www.castilloeventos.com/logo.jpg";
            //LOGO = urlLogo;//
            //MENSAJE_HTML = @"<h1>CastilloEventos</h1><img src=""cid:logo"" /><br /><p>Esto es una prueba de una imagen incrustada</p>" +
            //  @"<p>Visita <strong><a href=""http://www.CastilloEventos.com"">CastilloEventos</a></strong></p>";
            const string MENSAJE_TEXTO = "CastilloEventos\n\nwww.castilloeventos.com";

            const string MENSAJE_HTML = @"<head>" +
        @"<title>Página sin título</title>" +
        @"<style type=""text/css"">" +
        @"   .style2" +
        @"    {" +
        @"        height: 23px;" +
        @"    }" +
        @"    .style4" +
        @"    {" +
        @"        width: 511px;" +
        @"        color: #CCCCCC;" +
        @"        font-weight: 700;" +
        @"    }" +
        @"    .style5" +
        @"    {" +
        @"        width: 180px;" +
        @"    }" +
        @"    .style6" +
        @"    {" +
        @"        width: 170px;" +
        @"    }" +
        @"    .style7" +
        @"    {" +
        @"        width: 10px;" +
        @"    }" +
        @"    .style8" +
        @"    {" +
        @"        width: 250px;" +
        @"    }" +

        @".style14" +
        @"{  font-family: Tahoma;" +
        @"    font-size: small;} " +

        @".style16" +
        @"{   font-family  : Tahoma;" +
        @"    font-size: small;" +
        @"    font-weight: bold;}" +

        @".style9" +
        @"   {" +
        @"        width: 511px;" +
        @"        font-family: Tahoma;" +
        @"        font-size: medium;" +
        @"        color: #FFFFFF;" +
        @"    }" +
        @"</style>" +
    @"</head>" +
    @"<body bgcolor=""#000000"">" +

        @"<table bgcolor=""Black"" cellpadding=""-1"" cellspacing=""-1"" " +
        @"    style=""border-style: none; border-color: #000000; width: 100%;"">" +
        @"    <tr>" +
        @"        <td class=""style6"">" +
        @"            &nbsp;</td>" +
        @"        <td class=""style8"">" +
        @"            <img src=""cid:logo"" /></td>" +    //Original <img  src=""Imagenes/logo.jpg"" style=""width: 467px; height: 89px"" />
        @"        <td>" +
        @"            &nbsp;</td>" +
        @"    </tr>" +
        @"    <tr>" +
        @"        <td class=""style2"" colspan=""3"">" +
        @"            <table cellpadding=""0"" cellspacing=""0"" style=""width:100%;"">" +
        @"                <tr>" +
        @"                   <td class=""style5"">" +
        @"                        &nbsp;</td>" +
        @"                    <td bgcolor=""#C64787"" class=""style7"" " +
        @"                        style=""border-width: thin; border-color: #000000; border-style: solid none solid none;"">" +
        @"                        &nbsp;</td>" +
        @"                    <td bgcolor=""#C64787"" class=""style9"" " +
        @"                        style=""border-width: thin; border-color: #000000; border-style: solid none solid none;"">";
        




            System.Text.StringBuilder htmlPresup = new System.Text.StringBuilder(MENSAJE_HTML);
            //String encabezado = "Mediante la presente le informo los precios por usted solicitados. <br />";
            //htmlPresup.Append(encabezado);

            System.Text.StringBuilder menuCompleto = new StringBuilder();

            menuCompleto.Append(
                @"                PRESUPUESTO Nº&nbsp;" + Id.ToString() + "</td>" +
                @"                    <td bgcolor=""#C64787"" class=""style7"" " +
                @"                        style=""border-width: thin; border-color: #000000; border-style: solid none solid none;"">" +
                @"                        &nbsp;</td>" +
                @"                    <td>" +
                @"                        &nbsp;</td>" +
                @"                </tr>" +
                @"                <tr>" +
                @"                    <td class=""style5"">" +
                @"                        &nbsp;</td>" +
                @"                    <td bgcolor=""#00334C"" class=""style7"">" +
                @"                        &nbsp;</td>" +
                @"                    <td bgcolor=""#00547D"" class=""style4"">" +
                @"     <table cellpadding=""0"" cellspacing=""0"" style=""width:100%;"">");

            int i = 0;
            foreach (Presupuesto_Detalle pd in PresupuestoDetalle)
            {
                i++;

                menuCompleto.Append(

                     @"                        <tr>" +
                     @"                            <td style=""border: thin solid #00334C"" class=""style16"">" +
                     @"                                Menú opción " + i + "&nbsp;&nbsp;&nbsp;Precio por persona: $&nbsp;" + pd.PrecioVenta + "</td>" +
                     @"                        </tr>");
                //pd.Menu.Menu_Detalles = new List<Menu_Detalle>();//PRUEBA
                foreach (Menu_Detalle men in pd.Menu.Menu_Detalles)
                {
                    //menuCompleto.Append(men.AlimentoRef.Tipo_AlimentoRef.Nombre + "<br />");
                    menuCompleto.Append(
                        @" <tr>" +
                        @"                            <td bgcolor=""#0085C6"" style=""border: none "">" +
                        @"&nbsp;&nbsp;<span class=""style14"">&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;" + men.AlimentoRef.Tipo_AlimentoRef.Nombre + @"&nbsp;<span style=""font-weight:normal"">" + men.AlimentoRef.Nombre +
                        @"</span></span><br class=""style14"" />" +
                        @"</td>" +
                        @"</tr>");

                }





            }
            htmlPresup.Append(menuCompleto.ToString());

            htmlPresup.Append(
                     @"                        <tr>" +
                     @"                            <td style=""border: thin solid #00334C"" class=""style16"">" +
                     @"                                Bebidas</td>" +
                     @"                        </tr>");


            //modificado abajo
            //foreach (Bebida beb in Bebida)
            //{
            //    String bebidaItem;
            //    bebidaItem = @" <tr>" +
            //         @"                            <td bgcolor=""#0085C6"" style=""border: none"">" +
            //         @"&nbsp;&nbsp;<span class=""style14""><span style=""font-weight:normal"">&nbsp;&nbsp;&nbsp;&nbsp;- " + beb.Nombre +
            //         @"</span></span><br class=""style14"" />" +
            //         @"</td>" +
            //         @"</tr>";
            //    htmlPresup.Append(bebidaItem);

            //}

            foreach (Presupuesto_Bebida beb in Bebidas)
            {
                String bebidaItem;
                bebidaItem = @" <tr>" +
                     @"                            <td bgcolor=""#0085C6"" style=""border: none"">" +
                     @"&nbsp;&nbsp;<span class=""style14""><span style=""font-weight:normal"">&nbsp;&nbsp;&nbsp;&nbsp;- " + beb.Bebida.Nombre +
                     @"</span></span><br class=""style14"" />" +
                     @"</td>" +
                     @"</tr>";
                htmlPresup.Append(bebidaItem);

            }

            //String sAdicional;
            //sAdicional = "<br />&nbsp;&nbsp;&nbsp;&nbsp;El/los Servicios Adicionales son:<br />";
            htmlPresup.Append(
                     @"                        <tr>" +
                     @"                            <td style=""border: thin solid #00334C"" class=""style16"">" +
                     @"                                Servicios Adicionales</td>" +
                     @"                        </tr>");

            foreach (Servicio_Adicional sAd in ServicioAdicional)
            {
                String sAdicionalItem;
                sAdicionalItem = @" <tr>" +
                        @"                            <td bgcolor=""#0085C6"" style=""border: none "">" +
                        @"&nbsp;&nbsp;<span class=""style14"">&nbsp;&nbsp;&nbsp;&nbsp; -&nbsp;" + sAd.Tipo_ServicioRef.Nombre + @":&nbsp;<span style=""font-weight:normal"">" + sAd.Nombre +
                        @"</span></span><br class=""style14"" />" +
                        @"</td>" +
                        @"</tr>";
                htmlPresup.Append(sAdicionalItem);
            }


            String sal;
            sal = @"                        <tr>" +
                     @"                            <td style=""border: thin solid #00334C"" class=""style16"">" +
                     @"                                Salón</td>" +
                     @"                        </tr>" +
                     @" <tr>" +
                     @"                            <td bgcolor=""#0085C6"" style=""border: none "">" +
                     @"&nbsp;&nbsp;<span class=""style14""><span style=""font-weight:normal"">&nbsp;&nbsp;&nbsp;&nbsp;- " + salon.Nombre +
                     @"</span></span><br class=""style14"" />" +
                     @"</td>" +
                     @"</tr>";
            htmlPresup.Append(sal);

            String cPers;
            cPers = @"                        <tr>" +
                     @"                            <td style=""border: thin solid #00334C"" class=""style16"">" +
                     @"                                Catindad de invitados</td>" +
                     @"                        </tr>" +
                     @" <tr>" +
                     @"                            <td bgcolor=""#0085C6"" style=""border: none "">" +
                     @"&nbsp;&nbsp;<span style=""font-weight:normal"">&nbsp;&nbsp;&nbsp;&nbsp;- " + cantPersonas +
                     @"</span><br class=""style14"" />" +
                     @"</td>" +
                     @"</tr>";
            htmlPresup.Append(cPers);

            htmlPresup.Append(
        @"                    </table>" +
        @"                     <span style=""font-weight:normal"">Quedo a su disposición y aprovecho la oportunidad para saludarlo <br/> con distinguida consideración.<br/>" +
        @"    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"+
        @"    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" +
        @"    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" +
        @"    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" +
        @"    Saluda atte.<br/>"+
        @"   &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" +
        @"    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" +
        @"    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" +
        @" Alba de Castillo - Dirección</td></span>   " + 
        @"                    <td bgcolor=""#00334C"" class=""style7"">" +
        @"                      <br/> &nbsp;</td>" +
        @"                    <td>" +
        @"                     <br/>@&nbsp;</td>" +
        @"                </tr>" +
        @"                <tr>" +
        @"                    <td class=""style5"">" +
        @"                       &nbsp;</td>" +
        @"                    <td>" +
        @"                        <br/><br/><br/><br/><br/></td>" +
        @"                </tr>" +
        @"            </table>" +
        @"        </td>" +
        @"   </tr>" +
        @"</table>" +
        @"<br/><br/><br/><br/><br/>" +
        @"</body>");




            System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage();
            //msg.To.Add("jm_pereyra@hotmail.com,rodrigocba@hotmail.com");
            //msg.To.Add("jm_pereyra@hotmail.com");
            msg.To.Add(Cliente.Email);
            msg.From = new MailAddress("info@castilloeventos.com", "Castillo Eventos", System.Text.Encoding.UTF8);
            msg.Subject = "Castillo Eventos - Presupuesto";
            msg.SubjectEncoding = System.Text.Encoding.UTF8;



            AlternateView html = AlternateView.CreateAlternateViewFromString(htmlPresup.ToString(), System.Text.Encoding.UTF8, "text/html");
            AlternateView texto = AlternateView.CreateAlternateViewFromString(MENSAJE_TEXTO, System.Text.Encoding.UTF8, "text/html");
            LinkedResource logo = new LinkedResource(LOGO);
            logo.ContentId = "logo";
            html.LinkedResources.Add(logo);

            msg.AlternateViews.Add(texto);
            msg.AlternateViews.Add(html);


            msg.IsBodyHtml = true;

            //Aquí es donde se hace lo especial
            SmtpClient client = new SmtpClient();
            client.Credentials = new System.Net.NetworkCredential("info@castilloeventos.com", "U8ujmkk");
            client.Port = 587;
            client.Host = "mail.castilloeventos.com";
            //client.EnableSsl = true; //Esto es para que vaya a través de SSL que es obligatorio con GMail
            try
            {
                client.Send(msg);
            }
            catch (System.Net.Mail.SmtpException ex)
            {
                Console.WriteLine(ex.Message);
                Console.ReadLine();
                throw new SystemException(ex.Message);
            }

        }
        public DataTable listarPresupuestosEnviados()
        {
            Presupuesto_Data presu = new Presupuesto_Data();
            DataTable tabla = presu.popularPresupuestosEnviados();
            return tabla;
        }

        public DataTable listarPresupuestos()
        {
            Presupuesto_Data presu = new Presupuesto_Data();
            DataTable tabla = presu.popularPresupuestos();
            return tabla;
        }

        /*
         * En este metodo lo que realizo es la carga de las listas de
         * detalles, bebidas y servicios adicionales relacionados al presupuesto
         */
        public void buscarPresupuestoCompleto()
        {
            //Inicializo las variable de los dataview
            MenuesTabla = new List<DataView>();
            BebidasTabla = new DataView();
            SAdicionalesTabla = new DataView();

            //Genero el listado de los detalles relacionados al presupuesto
            presupuestoDetalle = Presupuesto_Detalle.listarPresupuestoDetalle_Lista(this);

            //Genero el listado de las bebidas relacionadas al presupuesto
            Bebidas = App_Negocio.Presupuesto_Bebida.listarPresupuestoBebida_Lista(this);

            //Genero el listado de los servicios adicionales relacionados al presupuesto
            ServicioAdicional = App_Negocio.Servicio_Adicional.listarServicios_Adicionales_Lista(this);

            //Actualizamos los precios de costo de los menues

            foreach (Presupuesto_Detalle pd in PresupuestoDetalle)
            {
                pd.calcularPrecioCosto();

            }

        }

        /*
         * SI BIEN SE QUE ESTO NO ESTA BIEN, ES UNAS SOLUCION FACIL QUE ENCONTRE
         * PARA MOSTRAR LAS COSAS DEL PRESUPUESTO
         */

        List <DataView> menuesTabla;

        public List<DataView> MenuesTabla
        {
            get { return menuesTabla; }
            set { menuesTabla = value; }
        }

        DataView bebidasTabla;

        public DataView BebidasTabla
        {
            get { return bebidasTabla; }
            set { bebidasTabla = value; }
        }
      
        DataView sAdicionalesTabla;

        public DataView SAdicionalesTabla
        {
            get { return sAdicionalesTabla; }
            set { sAdicionalesTabla = value; }
        }


        public void actualizarPresupuesto()
        {
            Presupuesto_Data presu = new Presupuesto_Data();
            presu.Id = this.Id;
            presu.PEstado = new Presupuesto_Estado_Data();
            presu.PEstado.Numero = 2;//este es el codigo que corresponde a enviado
            presu.PresupuestoDetalle = new List<Presupuesto_Detalles_Data>();

            //crear los nuevos presupuestos_detalle_data
            Presupuesto_Detalles_Data aux = null;
            foreach (Presupuesto_Detalle detalle in this.PresupuestoDetalle)
            {
                aux = new Presupuesto_Detalles_Data();
                aux.Menu = new Menu_Data();
                aux.Menu.Id = detalle.Menu.Id;
                if (detalle.PrecioVenta > 0)
                {
                    aux.PrecioVenta = detalle.PrecioVenta;
                }
                presu.PresupuestoDetalle.Add(aux);

            }


            presu.cambiarEstadoYPrecioPresupuesto();

        }

        public void calcularCostosPorTarjeta(float porcentajeGanancia)
        {
            double costo;
            double costodividible;
            
            foreach (Servicio_Adicional sAd in ServicioAdicional)
            {
                costodividible = +sAd.Precio;
            }
            /**
             * Se calcula de esta manera: bebidas por presupuesto tiene la cantidad que se tiene tener para
             * realizar el evento, en si lo que se hace es multiplicar la cant de invitados por la cantidad
             * de consumo estimada que esta en los atributos de la bebida.
             **/
            foreach (Presupuesto_Bebida beb in Bebidas)
            {
                beb.actualizarCantidadNecesaria(Id);
                costo = + beb.Costo();
            }

            Salon.damePrecio(Salon.Id);
            costodividible = +Salon.Precio;

            double precioVentaTotal = 0;

            //UTILIZAR EL METODO DE PRESUPUESTO DETALLE

            double costoFijo = 0;
            costoFijo = costodividible / CantPersonas;
            
            foreach (Presupuesto_Detalle pd in PresupuestoDetalle)
            {
                pd.calcularPrecioVenta(costoFijo, porcentajeGanancia);
            }
        }

        public DataTable traerPresupuestosNuevos()
        {
            Presupuesto_Data p = new Presupuesto_Data();
            return p.traerPresupuestosNuevos();
        }
        public DataTable listarPresupuestos(int i)
        {
            Presupuesto_Data presu = new Presupuesto_Data();
            DataTable tabla = presu.popularPresupuestos(i);
            return tabla;
        }
    }
}
            
 